const baseUrl = 'http://39.98.112.34:3000';
// 封装时间函数
function changeTime (time) {
  let d = new Date(time * 1000);
  let yy = d.getFullYear();
  let mouth = d.getMonth();
  let day = d.getDate();
  let hh = d.getHours();
  let mm = d.getMinutes();
  let ss = d.getSeconds();
  return yy + '年' + mouth + '月' + day + '日' + hh + '时' + mm + '分' + ss + '秒'
}
/**
 * 设置cookie
 * @param {String} key cookie的名称
 * @param {String} value cookie的值
 * @param {Number} expires 过期的时间  0表示浏览器关闭后就失效 其他的数字表示以当前时间计算多少秒之后过期
 */
 function setCookie(key, value, expires = 0) {
  if (expires == 0) {
      // 表示浏览器关闭cookie就失效
      document.cookie = `${key}=${value};path=/`;
  } else {
      let d = new Date();
      d.setTime(d.getTime() + expires * 1000 - 8 * 3600 * 1000)
      document.cookie = `${key}=${value};path=/;expires=` + d;
  }
}
/**
* 获取指定名称的cookie
* @param {String} key 获取cookie的名称 
*/
function getCookie(key) {
  // 将整个cookie的字符串分割形成对象
  let result = str2Obj(document.cookie, '; ')
  return result[key];
}
/**
* 删除cookie
* @param {String} key 被删除cookie的名称
*/
function removeCookie(key) {
  // 删除cookie值无须考虑 时间传递负数 最终会计算出一个已经过期了的时间
  setCookie(key, 0, -1)
}
function str2Obj(str, separator1 = '&', separator2 = '=') {
  if (str.length == 0) return {};
  let result = {};
  str.split(separator1).forEach(item => {
      let keyValue = item.split(separator2)
      result[keyValue[0]] = keyValue[1];
  })
  return result;
}

//ajax
function ajax (options) {
  // 设置默认参数
  let defig = {
    type: 'get', // 请求类型
    url: '',  // 请求地址
    data: '', //所携带的数据
    contentType: 'application/json',// 默认请求头
    headers: {}, // 其他请求头信息
    dataType: 'json', // 服务器返回来的数据格式
    success: function () { }
  }

  // 合并默认参数
  for (let key in defig) {
    //if (options[key]) { defig[key] = options[key] }
    options[key] != undefined && (defig[key] = options[key]);
  }
  console.log(defig)
  // 判断type
  let typeArr = ['get', 'post', 'put', 'delete']
  typeArr.forEach(item => {
    console.log(item)
    let tyep = defig.type.toLowerCase()
    if (!typeArr.includes(tyep)) {
      throw new Error('发起的请求类型有错误！！！')
    }
  })
  // 判断URL地址
  if (!(defig.url.startsWith('http') || defig.url.startsWith('https'))) {
    throw new Error('协议错误！！！')
  }
  // 验证参数 参数只能是字符串或者对象
  let flag = Object.prototype.toString.call(defig.data)
  if (flag != '[object Object]' && flag != '[object String]') {
    throw new Error('参数错误,参数只能是对象或者字符串')
  }
  // 判断请求头

  if (defig.contentType != 'application/json' && defig.contentType != 'application/x-www-form-urlencoded') {
    throw new Error('contentType头不被支持')
  }
  // 判断header其他类型
  // headers 是一个对象 
  if (defig.headers.constructor != Object) {
    throw new Error('请求头数据类型错误！！！')
  }
  // 判断回调是不是函数
  if (Object.prototype.toString.call(defig.success) != '[object Function]') {
    throw new Error('回调必须设置为函数')
  }

  let xhr = new XMLHttpRequest;
  if (defig.type == 'post' || defig.type == 'put') {
    xhr.open(defig.type, defig.url)
  } else {
    let date = ''
    if (Object.prototype.toString.call(defig.data) == '[object Object]') {
      date = changeStr(defig.data)
    }
    let url = defig.url + '?' + date
    xhr.open(defig.type, defig.url + '?' + date)
  }
  xhr.setRequestHeader('Content-Type', defig.contentType);
  for (let key in defig.headers) {
    key != 'Content-Type' && xhr.setRequestHeader(key, defig.headers[key])
  }
  let requestBody = '';
  // 到现在 请求参数config.data 绝对是对象 放在send方法中的参数要字符串 字符串格式跟请求头content-type有关系
  if (defig.type == 'post' || defig.type == 'put') {
    if (defig.contentType == 'application/json') {
      requestBody = JSON.stringify(defig.data);
    } else {
      // 转换为表单格式的数据
      for (let key in defig.data) {
        requestBody += `${key}=${defig.data[key]}&`
      }
      requestBody = requestBody.slice(0, -1);
    }
  }
  xhr.send(requestBody);
  xhr.onload = () => {
    // 获取服务端返回结果  如果服务端返回的是JSON格式直接转为对象 否则 不做处理
    let response = (defig.dataType == 'json') ? JSON.parse(xhr.responseText) : xhr.responseText;
    defig.success(response);
  }

}
// 将对象转化为字符串
// 字符串格式a=1&b=1
function changeStr (obj) {
  let result = '';
  for (let key in obj) {
    result += `${key}=${obj[key]}&`
  }
  return result;
}